package com.blogsystem.service.impl;

import com.blogsystem.entity.User;
import com.blogsystem.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

/**
 * 自定义用户详情服务类，用于 Spring Security 的认证流程。
 */
@Service
public class MyUserDetailsService implements UserDetailsService {
    private final PasswordEncoder passwordEncoder;
    @Autowired
    private UserMapper userMapper; // 注入 UserMapper，用于数据库操作

    public MyUserDetailsService(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
        this.userMapper = userMapper;
    }

    /**
     * 根据用户名加载用户信息。
     *
     * @param username 用户名
     * @return UserDetails Spring Security 可识别的用户详情对象
     * @throws UsernameNotFoundException 如果找不到对应用户名，抛出异常
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 使用 MyBatis Plus 查询数据库中的用户
        User user = userMapper.selectOneByUsername(username);

        if (user == null) {
            // 如果用户不存在，抛出异常并提示用户名不存在
            throw new UsernameNotFoundException("用户名 " + username + " 不存在");
        }

        // 构建并返回 Spring Security 可识别的 UserDetails 对象
        return org.springframework.security.core.userdetails.User
                .withUsername(user.getUsername())       // 设置用户名
                .password(user.getPassword())          // 设置密码
                .roles(user.getRole() == 1 ? "ADMIN" : "USER") // 根据角色字段设置角色（1 表示 ADMIN，其他为 USER）
                .build();
    }




    public void saveUser(User user) {
        // 加密密码
        user.setPassword(passwordEncoder.encode(user.getPassword()));
    }


    public boolean isUsernameExists(String username) {
        // 检查用户名是否已存在
        return userMapper.selectOneByUsername(username) != null;
    }
}
